/*!
 * \file WtExecRunner.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 执行监控运行器定义
 * 
 * \details 本文件定义了WonderTrader执行监控系统的核心运行器类WtExecRunner，
 *          负责整个执行监控系统的初始化、配置、运行和管理。
 *          
 *          主要功能包括：
 *          - 系统组件的生命周期管理
 *          - 行情解析器和交易通道的管理
 *          - 执行器工厂和执行管理器的协调
 *          - 基础数据和热点合约管理
 *          - 实时行情处理和分发
 *          - 持仓目标设置和执行监控
 *          
 *          该类是执行监控系统的核心控制器，协调各个组件的工作。
 */
#pragma once

#include "WtSimpDataMgr.h"

#include "../WtCore/WtExecMgr.h"
#include "../WtCore/TraderAdapter.h"
#include "../WtCore/ParserAdapter.h"
#include "../WtCore/ActionPolicyMgr.h"

#include "../WTSTools/WTSHotMgr.h"
#include "../WTSTools/WTSBaseDataMgr.h"

NS_WTP_BEGIN
class WTSVariant;
NS_WTP_END

USING_NS_WTP;

/*!
 * \class WtExecRunner
 * \brief 执行监控运行器
 * 
 * \details WtExecRunner是执行监控系统的核心运行器类，负责整个系统的
 *          初始化、配置、运行和管理。它继承了IParserStub和IExecuterStub
 *          接口，能够处理行情数据推送和为执行器提供必要的服务。
 *          
 *          主要职责包括：
 *          - 管理行情解析器、交易适配器、执行器等组件
 *          - 处理实时行情数据并分发给相关组件
 *          - 提供基础数据、热点合约、交易时段等信息服务
 *          - 执行持仓目标设置和监控
 *          - 协调各组件的初始化和运行
 *          
 * \note 该类采用单例模式，通过静态函数获取实例
 * \see IParserStub, IExecuterStub
 */
class WtExecRunner : public IParserStub, public IExecuterStub
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化执行监控运行器，设置信号处理钩子（Unix系统）。
	 *          在Windows系统中禁用信号钩子，在Unix系统中启用。
	 */
	WtExecRunner();

	/*!
	 * \brief 初始化执行监控系统
	 * 
	 * \details 初始化日志系统、设置安装目录、启用内存转储（Windows）。
	 *          该函数必须在其他操作之前调用。
	 * 
	 * \param logCfg 日志配置文件路径，默认为"logcfgexec.json"
	 * \param isFile 是否为文件路径，true表示文件路径，false表示配置内容
	 * \return 初始化是否成功
	 * 
	 * \note Windows系统下会启用内存转储功能用于调试
	 */
	bool init(const char* logCfg = "logcfgexec.json", bool isFile = true);

	/*!
	 * \brief 配置执行监控系统
	 * 
	 * \details 加载系统配置文件，初始化各个组件包括：
	 *          - 基础数据管理器（交易时段、品种、合约、节假日）
	 *          - 数据管理器
	 *          - 行为策略管理器
	 *          - 行情解析器
	 *          - 交易适配器
	 *          - 执行器
	 * 
	 * \param cfgFile 配置文件路径或配置内容
	 * \param isFile 是否为文件路径，true表示文件路径，false表示配置内容
	 * \return 配置是否成功
	 * 
	 * \note 配置文件应包含parsers、traders、executers等节点
	 */
	bool config(const char* cfgFile, bool isFile = true);

	/*!
	 * \brief 运行执行监控系统
	 * 
	 * \details 启动行情解析器和交易适配器，开始接收行情数据和处理交易。
	 *          该函数会启动所有已配置的组件，系统进入运行状态。
	 * 
	 * \note 该函数可能会阻塞，直到系统停止运行
	 */
	void run();

	/*!
	 * \brief 释放系统资源
	 * 
	 * \details 停止所有组件的运行，释放分配的资源。
	 *          该函数应在系统退出前调用。
	 */
	void release();

	/*!
	 * \brief 设置持仓目标
	 * 
	 * \details 为指定合约设置目标持仓量，执行管理器将根据当前持仓
	 *          和目标持仓的差异，通过配置的执行器执行相应的交易指令。
	 * 
	 * \param stdCode 标准合约代码（如：SHFE.rb2101）
	 * \param targetPos 目标持仓量，正数为多头，负数为空头，0为平仓
	 * 
	 * \note 执行器将根据配置的执行策略（如TWAP、最小冲击等）执行交易
	 */
	void setPosition(const char* stdCode, double targetPos);

	/*!
	 * \brief 添加执行器工厂
	 * 
	 * \details 从指定文件夹加载执行器工厂动态库，扩展系统的执行器类型。
	 *          支持加载多种执行算法，如TWAP、VWAP、最小冲击等。
	 * 
	 * \param folder 执行器工厂动态库所在文件夹路径
	 * \return 加载是否成功
	 * 
	 * \note 执行器工厂必须实现标准的工厂接口
	 */
	bool addExeFactories(const char* folder);

	/*!
	 * \brief 获取基础数据管理器
	 * 
	 * \details 获取基础数据管理器的指针，用于访问品种、合约、
	 *          交易时段等基础数据信息。
	 * 
	 * \return 基础数据管理器指针
	 */
	IBaseDataMgr*	get_bd_mgr() { return &_bd_mgr; }

	/*!
	 * \brief 获取热点管理器
	 * 
	 * \details 获取热点管理器的指针，用于访问主力合约、
	 *          次主力合约等热点合约信息。
	 * 
	 * \return 热点管理器指针
	 */
	IHotMgr* get_hot_mgr() { return &_hot_mgr; }

	/*!
	 * \brief 获取交易时段信息
	 * 
	 * \details 根据时段ID或合约代码获取对应的交易时段信息。
	 * 
	 * \param sid 时段ID或合约代码
	 * \param isCode 是否为合约代码，true表示合约代码，false表示时段ID
	 * \return 交易时段信息指针，未找到时返回NULL
	 */
	WTSSessionInfo* get_session_info(const char* sid, bool isCode = true);

	//////////////////////////////////////////////////////////////////////////
	/// IParserStub接口实现
	
	/*!
	 * \brief 处理实时行情数据推送
	 * 
	 * \details 接收行情解析器推送的实时tick数据，更新数据管理器的缓存，
	 *          并将行情数据分发给执行管理器进行处理。
	 * 
	 * \param curTick 当前tick数据指针
	 * \param hotFlag 热点标志，用于标识主力合约等信息
	 * 
	 * \note 该函数是行情数据处理的入口点
	 */
	virtual void handle_push_quote(WTSTickData* curTick, uint32_t hotFlag = 0) override;

	///////////////////////////////////////////////////////////////////////////
	//IExecuterStub 接口实现
	
	/*!
	 * \brief 获取实时时间
	 * 
	 * \details 获取当前的实时时间戳，用于执行器的时间相关计算。
	 * 
	 * \return 实时时间戳（微秒级）
	 */
	virtual uint64_t get_real_time() override;
	
	/*!
	 * \brief 获取品种信息
	 * 
	 * \details 根据标准合约代码获取对应的品种信息。
	 * 
	 * \param stdCode 标准合约代码
	 * \return 品种信息指针，未找到时返回NULL
	 */
	virtual WTSCommodityInfo* get_comm_info(const char* stdCode) override;
	
	/*!
	 * \brief 获取交易时段信息
	 * 
	 * \details 根据标准合约代码获取对应的交易时段信息。
	 * 
	 * \param stdCode 标准合约代码
	 * \return 交易时段信息指针，未找到时返回NULL
	 */
	virtual WTSSessionInfo* get_sess_info(const char* stdCode) override;
	
	/*!
	 * \brief 获取热点监控器
	 * 
	 * \details 获取热点监控器的指针，用于执行器访问热点合约信息。
	 * 
	 * \return 热点监控器指针
	 */
	virtual IHotMgr* get_hot_mon() override { return &_hot_mgr; }
	
	/*!
	 * \brief 获取交易日
	 * 
	 * \details 获取当前的交易日期。
	 * 
	 * \return 交易日期（格式：yyyyMMdd）
	 */
	virtual uint32_t get_trading_day() override;

private:
	/*!
	 * \brief 初始化交易适配器
	 * 
	 * \details 根据配置信息初始化交易适配器，建立与交易系统的连接。
	 * 
	 * \param cfgTrader 交易适配器配置信息
	 * \return 初始化是否成功
	 */
	bool initTraders(WTSVariant* cfgTrader);
	
	/*!
	 * \brief 初始化行情解析器
	 * 
	 * \details 根据配置信息初始化行情解析器，建立行情数据接收通道。
	 * 
	 * \param cfgParser 行情解析器配置信息
	 * \return 初始化是否成功
	 */
	bool initParsers(WTSVariant* cfgParser);
	
	/*!
	 * \brief 初始化执行器
	 * 
	 * \details 根据配置信息初始化执行器，设置执行算法和参数。
	 * 
	 * \param cfgExecuter 执行器配置信息
	 * \return 初始化是否成功
	 */
	bool initExecuters(WTSVariant* cfgExecuter);
	
	/*!
	 * \brief 初始化数据管理器
	 * 
	 * \details 初始化简单数据管理器，设置数据存储和缓存机制。
	 * 
	 * \return 初始化是否成功
	 */
	bool initDataMgr();
	
	/*!
	 * \brief 初始化行为策略
	 * 
	 * \details 初始化行为策略管理器，设置交易行为控制策略。
	 * 
	 * \return 初始化是否成功
	 */
	bool initActionPolicy();

private:
	TraderAdapterMgr	_traders;		/*!< 交易适配器管理器 */
	ParserAdapterMgr	_parsers;		/*!< 行情解析器管理器 */
	WtExecuterFactory	_exe_factory;	/*!< 执行器工厂 */
	WtExecuterMgr		_exe_mgr;		/*!< 执行管理器 */

	WTSVariant*			_config;		/*!< 系统配置信息 */

	WtSimpDataMgr		_data_mgr;		/*!< 简单数据管理器 */

	WTSBaseDataMgr		_bd_mgr;		/*!< 基础数据管理器 */
	WTSHotMgr			_hot_mgr;		/*!< 热点管理器 */
	ActionPolicyMgr		_act_policy;	/*!< 行为策略管理器 */
};

